<!DOCTYPE html>
<html lang="en">
<head>
    <title>囧么肥事</title>
    <meta charset="UTF-8"/>
    <meta name="viewport"
          content="width=device-width,height=device-height,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta http-equiv="Content-Type" content="text/html;"/>
    <meta name="renderer" content="webkit">
    <!--解决页面加载网络图片的403问题 , 可以让img标签预加载网络图片-->
    <meta name="referrer" content="no-referrer" />

    <!--markdown S -->
    <link rel="stylesheet" type="text/css" href="../../static/css/export_setting_css.css"/>
    <link rel="stylesheet" type="text/css" href="../../static/css/markdown_preview_css.css"/>
    <!--markdown E -->

    <!--left bar tools css E-->
    <link rel="stylesheet" type="text/css" href="../../static/css/nav.css">
    <link rel="stylesheet" type="text/css" href="http://www.jq22.com/jquery/font-awesome.4.6.0.css">
    <!--left bar tools css E-->

    <!-- 滚动条 S -->
    <link rel="stylesheet" href="../../static/css/optiscroll.css">
    <!-- 滚动条 E -->
</head>
<body>
<div id="m-wrapper" class="m-wrapper optiscroll">
    <!-- top 锚点 -->
    <a id="top"></a>

    <!-- left bar tools S -->
    <div class="leftNav-item">
        <ul>
            <li>
                <i class="fa fa-location-arrow"></i>
                <a href="http://jiongmefeishi.gitee.io/monster-blog/" target="_blank" class="rota">个人网站</a>
            </li>

            <li title="Git">
                <i class="fa fa-code-fork" aria-hidden="true"></i>
                <a href="http://jiongmefeishi.gitee.io/monster-blog/" target="_blank" class="rota">Git Page</a>
            </li>

            <li lay-data="img" data-fooc="http://resource.zqtaotao.cn/wx/qrcode/jiongmefeishi.jpg">
                <i class="fa fa-comments-o"></i><a href="javascript:;" class="rota">公众号</a>
            </li>

            <li lay-data="img" data-fooc="http://resource.zqtaotao.cn/weixincode.png">
                <i class="fa fa-money"></i><a href="javascript:;" class="rota">小额打赏</a>
            </li>
            <li title="返回顶部" class="for-top">
                <i class="fa fa-arrow-up"></i>
                <a href="#top" class="rota">去顶部</a>
            </li>
        </ul>
    </div>
    <!-- left bar tools E -->

    <!--content S-->
    <div id="export_content"><div class="output_wrapper" id="output_wrapper_id"><h3 id="hk8sstatefulsetpod"><span>k8s集群线上某些特殊情况强制删除 StatefulSet 的 Pod 隐患考虑？</span></h3>
        <pre><code class="hljs">考点之什么情况下，需要强制删除&nbsp;StatefulSet&nbsp;的&nbsp;Pod?<br></code></pre>
        <pre><code class="hljs">考点之如果&nbsp;StatefulSet&nbsp;操作不当可能会引发什么很严重的后果？<br></code></pre>
        <pre><code class="hljs bash">考点之如果遇到Pod&nbsp;长时间处于&nbsp;<span class="hljs-string">'Terminating'</span>&nbsp;或者&nbsp;<span class="hljs-string">'Unknown'</span>&nbsp;状态情况，有什么安全一些的处理手段吗？<br></code></pre>
        <figure><img src="https://img-blog.csdnimg.cn/img_convert/18d2a7f0e4c1a141655503d9cb8fb609.gif" alt="img" title="img"><figcaption>img</figcaption></figure>
        <h3 id="h"><span>囧么肥事-胡说八道</span></h3>
        <figure><img src="https://img-blog.csdnimg.cn/img_convert/34db4c8167452b8bb065036210051a6c.png" alt="img" title="img"><figcaption>img</figcaption></figure>
        <figure><img src="https://img-blog.csdnimg.cn/img_convert/0e5a8c6dd696f71984d4caa746c9030d.png" alt="img" title="img"><figcaption>img</figcaption></figure>
        <h3 id="hstatefulsetpod"><span>线上某些特殊情况下可能需要强制删除 StatefulSet 的 Pod？</span></h3>
        <p><strong>什么情况下，需要强制删除 StatefulSet 的 Pod?</strong></p>
        <p><strong>正常情况下</strong></p>
        <p><code>StatefulSet</code> 常规场景下，不需要强制删除 <code>StatefulSet</code> 管理的 Pod。 </p>
        <p><code>StatefulSet</code> 控制器会负责创建、 扩缩和删除 <code>StatefulSet</code> 管理的 Pods。</p>
        <p>它尝试确保指定数量的从序数 <code>0 到 N-1 的 Pod</code> 处于活跃状态并准备就绪。</p>
        <p><code>StatefulSet</code> 遵循<code>At Most One</code>（最多一个）规则，确保在任何时候，集群中<strong>最多只有一个</strong>具有给定标识的 Pod。</p>
        <figure><img src="https://img-blog.csdnimg.cn/img_convert/8346404210a328cc09ae33a1af6ecf1b.gif" alt="img" title="img"><figcaption>img</figcaption></figure>
        <p><strong>特殊情况下</strong></p>
        <p>所谓特殊情况下必须进行强制删除，SS感知到当某个<strong>节点不可达</strong>时，<strong>不会引发自动删除 Pod</strong>。在无法访问的节点上运行的 Pod 在超时 后会进入'<code>Terminating</code>' 或者 '<code>Unknown</code>' 状态，另外当用户尝试体面地删除无法访问的节点上的 Pod 时 Pod 也可能会进入这些状态。</p>
        <p>如果你发现 StatefulSet 的某些 Pod 长时间处于 '<code>Terminating</code>' 或者 '<code>Unknown</code>' 状态</p>
        <p>无法自己完成正常的调度，为了k8s集群的稳定服务，这个时候可能需要<strong>手动干预</strong>，以<strong>强制的手段从 API 服务器中删除这些 Pod</strong>。</p>
        <h3 id="hstatefulset"><span>如果StatefulSet 操作不当可能会引发什么很严重的后果？</span></h3>
        <p>应谨慎进行<strong>手动强制删除</strong>操作，因为它可能会<strong>违反 StatefulSet 固有的至多一个的规则</strong>。</p>
        <p><code>StatefulSets</code> 用于运行<strong>分布式和集群级</strong>的应用，这些应用需要<strong>稳定的网络标识和可靠的存储</strong>。 </p>
        <p>这些应用通常配置为具有<strong>固定标识固定数量</strong>的成员集合，每个Pod都是<strong>唯一的，独立的</strong>，你可以理解为每个人的身份证编号都是唯一的。</p>
        <p>具有相同身份的多个成员（Pod）可能是灾难性的，<strong>可能导致数据丢失</strong> (例如：票选系统中的脑裂场景)。</p>
        <p>而强制删除，可能就会导致SS出现多个Pod使用同一张身份证。</p>
        <p><strong>违反了”每人一证“原则。</strong></p>
        <figure><img src="https://img-blog.csdnimg.cn/img_convert/763ee3f7a736c19940416b4be0feffa7.png" alt="img" title="img"><figcaption>img</figcaption></figure>
        <p><strong>问题来了，为什么就会出现多个相同标识的Pod呢？</strong></p>
        <p>原来，不同于Pod体面终止的是，在进行强制删除过程中，API 服务器<strong>不会</strong>等待来自 kubelet 对 Pod <strong>已终止的确认消息</strong>，它会<strong>立即从 API 服务器中释放该名字</strong>。</p>
        <p>我们知道<code>StatefulSet</code> 中每个Pod有固定标识，而且不随着Pod的重新调度而改变。</p>
        <p>在进行重新调度的时候，新调度创建的Pod会继承上一个旧Pod的一切有用资源，比如PV，唯一标识，网络标识等。</p>
        <p>强制删除，直接从API服务器移除Pod对象，这个时候，<code>StatefulSet</code> 控制器有机会去创建一个<strong>具有相同标识的替身 Pod</strong>，并且去继承旧Pod的资源。</p>
        <p>尚未完全删除Pod，如果创建了替身，那么此时和替身共享一个唯一标识，<strong>违反 StatefulSet 固有的至多一个的规则</strong>。</p>
        <p>这是后果，主要的还是它的附带后果。</p>
        <p>是什么呢？最绝的来了，<strong>尚未完全删除的 Pod 仍然可以与 StatefulSet 的成员通信</strong>，也就是说它仍然可以操作PV，可能导致PV数据流失。</p>
        <figure><img src="https://img-blog.csdnimg.cn/img_convert/5cb5135532aa3f00e16c46af3e6315e2.gif" alt="img" title="img"><figcaption>img</figcaption></figure>
        <h3 id="hpodterminatingunknown"><span>如果遇到Pod 长时间处于 '`Terminating`' 或者 '`Unknown`' 状态情况，有什么安全一些的处理手段吗？</span></h3>
        <p><strong>安全处理？</strong></p>
        <p>既然知道了问题产生的原因，有什么安全一些的处理手段吗？</p>
        <p>如果遇到Pod 长时间处于 '<code>Terminating</code>' 或者 '<code>Unknown</code>' 状态情况，再进行强制删除之前可以先考虑以下处理方式：</p>
        <p><strong>第一种情况</strong>，如果确认节点已经不可用了 (比如，永久断开网络、断电等)， 可以<strong>主动删除掉点节点对象</strong>，或者通过节点控制器来进行删除。</p>
        <p><strong>第二种情况</strong>，如果节点遇到网裂问题，请<strong>尝试解决该问题或者等待其解决</strong>。 当网裂愈合时，<code>kubelet</code> 将完成 Pod 的删除并从 API 服务器上释放其名字。</p>
        <p><strong>第三种情况</strong>，必须强制，无可选择。⚠️当你确定必须执行强制删除 <code>StatefulSet</code> 类型的 Pod 时，你要确保有问题的 Pod <strong>不会再和 StatefulSet 管理的其他 Pod 通信</strong>并且可以<strong>安全地释放其名字</strong>以便创建替代 Pod。</p>
        <figure><img src="https://img-blog.csdnimg.cn/img_convert/f7ad05479c60791d24254a4199d6bd08.gif" alt="img" title="img"><figcaption>img</figcaption></figure>
        <p>Kubernetes 推荐学习书</p>
        <blockquote>
            <p>Kubernetes权威指南PDF<br>链接: https://pan.baidu.com/s/11huLHJkCeIPZqSyLEoUEmQ 提取码:sa88</p>
        </blockquote>
        <p>k8s系列所有问题更新记录：<a href="https://gitee.com/jiongmefeishi/JMFS-Interview-Notebook-Kubernetes">GitHub</a></p></div></div>
    <!--content E-->
</div>



</body>
<!--left bar tools js S-->
<script src="http://www.jq22.com/jquery/jquery-1.10.2.js"></script>
<script type="text/javascript" src="../../static/js/nav.js"></script>
<!--left bar tools js E-->

<!-- 滚动条 S -->
<script type="text/javascript" src="../../static/js/optiscroll.js"></script>
<!-- 滚动条 E -->

<!--commonjs S-->
<script type="text/javascript" src="../../static/js/common.js"></script>
<!--commonjs E-->

</html>
